Generated by Cython 3.0.2

Yellow lines hint at Python interaction.
Click on a line that starts with a "+" to see the C code that Cython generated for it.

Raw output: sr_radiality.c

+001: # cython: infer_types=True, wraparound=False, nonecheck=False, boundscheck=False, cdivision=True, language_level=3, profile=False, autogen_pxd=True
  __pyx_t_7 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_7) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 002: 
 003: """
 004: Python reimplementation of the Radiality Transform from the original SRRF paper
 005: Paper: https://www.nature.com/articles/ncomms12471
 006: Original code: https://github.com/HenriquesLab/NanoJ-SRRF/blob/master/SRRF/src/nanoj/srrf/java/SRRF.java
 007: """
 008: 
 009: from libc.math cimport sqrt, pi, fabs, cos, sin
 010: from libc.stdlib cimport free
 011: 
+012: import numpy as np
  __pyx_t_7 = __Pyx_ImportDottedModule(__pyx_n_s_numpy, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_7) < 0) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 013: cimport numpy as np
 014: 
 015: from .interpolation_catmull_rom cimport _interpolate
+016: from ..utils.timeit import timeit2
  __pyx_t_7 = PyList_New(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_INCREF(__pyx_n_s_timeit2);
  __Pyx_GIVEREF(__pyx_n_s_timeit2);
  if (__Pyx_PyList_SET_ITEM(__pyx_t_7, 0, __pyx_n_s_timeit2)) __PYX_ERR(0, 16, __pyx_L1_error);
  __pyx_t_4 = __Pyx_Import(__pyx_n_s_utils_timeit, __pyx_t_7, 2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_ImportFrom(__pyx_t_4, __pyx_n_s_timeit2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_timeit2, __pyx_t_7) < 0) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 017: 
 018: from cython.parallel import prange
 019: 
+020: cdef class Radiality:
struct __pyx_vtabstruct_7nanopyx_4core_9transform_12sr_radiality_Radiality {
  void (*_calculate_radiality)(struct __pyx_obj_7nanopyx_4core_9transform_12sr_radiality_Radiality *, __Pyx_memviewslice, __Pyx_memviewslice, __Pyx_memviewslice, __Pyx_memviewslice, __Pyx_memviewslice, float, float);
  float (*_calculateDk)(struct __pyx_obj_7nanopyx_4core_9transform_12sr_radiality_Radiality *, float, float, float, float, float, float, float);
};
static struct __pyx_vtabstruct_7nanopyx_4core_9transform_12sr_radiality_Radiality *__pyx_vtabptr_7nanopyx_4core_9transform_12sr_radiality_Radiality;

 021:     # autogen_pxd: cdef int magnification, symmetryAxis, border, nRingCoordinates
 022:     # autogen_pxd: cdef float ringRadius, psfWidth, gradRadius
 023:     # autogen_pxd: cdef bint doIntegrateLagTimes, radialityPositivityConstraint, doIntensityWeighting
 024:     # autogen_pxd: cdef float[12] xRingCoordinates, yRingCoordinates
 025: 
+026:     def __init__(self, magnification: int = 5, ringRadius: float = 0.5, border: int = 0, radialityPositivityConstraint: bool = True, doIntensityWeighting: bool = True):
/* Python wrapper */
static int __pyx_pw_7nanopyx_4core_9transform_12sr_radiality_9Radiality_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
PyDoc_STRVAR(__pyx_doc_7nanopyx_4core_9transform_12sr_radiality_9Radiality___init__, "\n        Calculate Radiality, as defined on the original version of SRRF - REF: https://www.nature.com/articles/ncomms12471\n        :param magnification: Desired magnification for the generated radiality image\n        :param ringRadius: Radius of the ring used to calculate the radiality\n        :param border: Number of pixels to be zeroed on the borders of the radiality image\n        :param radialityPositivityConstraint: If True, the radiality image will be constrained to be positive (values >= 0)\n        :param doIntensityWeighting: If True, the radiality image will be weighted by the intensity of the original image\n        ");
#if CYTHON_UPDATE_DESCRIPTOR_DOC
struct wrapperbase __pyx_wrapperbase_7nanopyx_4core_9transform_12sr_radiality_9Radiality___init__;
#endif
static int __pyx_pw_7nanopyx_4core_9transform_12sr_radiality_9Radiality_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_magnification = 0;
  double __pyx_v_ringRadius;
  PyObject *__pyx_v_border = 0;
  PyObject *__pyx_v_radialityPositivityConstraint = 0;
  PyObject *__pyx_v_doIntensityWeighting = 0;
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  #if CYTHON_ASSUME_SAFE_MACROS
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args);
  if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 26, __pyx_L3_error)
  #endif
  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
  {
    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_magnification,&__pyx_n_s_ringRadius,&__pyx_n_s_border,&__pyx_n_s_radialityPositivityConstraint,&__pyx_n_s_doIntensityWeighting,0};
  PyObject* values[5] = {0,0,0,0,0};
    values[0] = __Pyx_Arg_NewRef_VARARGS(__pyx_k__11);
    values[2] = __Pyx_Arg_NewRef_VARARGS(__pyx_k__12);
    values[3] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)Py_True));
    values[4] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)Py_True));
    if (__pyx_kwds) {
      Py_ssize_t kw_args;
      switch (__pyx_nargs) {
        case  5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
      switch (__pyx_nargs) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_magnification);
          if (value) { values[0] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; }
          else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 26, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  1:
        if (kw_args > 0) {
          PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_ringRadius);
          if (value) { values[1] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; }
          else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 26, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_border);
          if (value) { values[2] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; }
          else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 26, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (kw_args > 0) {
          PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_radialityPositivityConstraint);
          if (value) { values[3] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; }
          else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 26, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (kw_args > 0) {
          PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_doIntensityWeighting);
          if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; }
          else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 26, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t kwd_pos_args = __pyx_nargs;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 26, __pyx_L3_error)
      }
    } else {
      switch (__pyx_nargs) {
        case  5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_magnification = ((PyObject*)values[0]);
    if (values[1]) {
      __pyx_v_ringRadius = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_ringRadius == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 26, __pyx_L3_error)
    } else {
      __pyx_v_ringRadius = ((double)0.5);
    }
    __pyx_v_border = ((PyObject*)values[2]);
    __pyx_v_radialityPositivityConstraint = values[3];
    __pyx_v_doIntensityWeighting = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 0, 0, 5, __pyx_nargs); __PYX_ERR(0, 26, __pyx_L3_error)
  goto __pyx_L3_error;
  __pyx_L3_error:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
    }
  }
  __Pyx_AddTraceback("nanopyx.core.transform.sr_radiality.Radiality.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_magnification), (&PyInt_Type), 0, "magnification", 1))) __PYX_ERR(0, 26, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_border), (&PyInt_Type), 0, "border", 1))) __PYX_ERR(0, 26, __pyx_L1_error)
  __pyx_r = __pyx_pf_7nanopyx_4core_9transform_12sr_radiality_9Radiality___init__(((struct __pyx_obj_7nanopyx_4core_9transform_12sr_radiality_Radiality *)__pyx_v_self), __pyx_v_magnification, __pyx_v_ringRadius, __pyx_v_border, __pyx_v_radialityPositivityConstraint, __pyx_v_doIntensityWeighting);

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = -1;
  __pyx_L0:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
    }
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_7nanopyx_4core_9transform_12sr_radiality_9Radiality___init__(struct __pyx_obj_7nanopyx_4core_9transform_12sr_radiality_Radiality *__pyx_v_self, PyObject *__pyx_v_magnification, double __pyx_v_ringRadius, PyObject *__pyx_v_border, PyObject *__pyx_v_radialityPositivityConstraint, PyObject *__pyx_v_doIntensityWeighting) {
  float __pyx_v_angleStep;
  int __pyx_v_angleIter;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__", 0);
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("nanopyx.core.transform.sr_radiality.Radiality.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  if (!(likely(__Pyx_Py3Int_CheckExact(__pyx_int_5)) || __Pyx_RaiseUnexpectedTypeError("int", __pyx_int_5))) __PYX_ERR(0, 26, __pyx_L1_error)
  __Pyx_INCREF(__pyx_int_5);
  __pyx_k__11 = ((PyObject*)__pyx_int_5);
  __Pyx_GIVEREF(__pyx_int_5);
  if (!(likely(__Pyx_Py3Int_CheckExact(__pyx_int_0)) || __Pyx_RaiseUnexpectedTypeError("int", __pyx_int_0))) __PYX_ERR(0, 26, __pyx_L1_error)
  __Pyx_INCREF(__pyx_int_0);
  __pyx_k__12 = ((PyObject*)__pyx_int_0);
  __Pyx_GIVEREF(__pyx_int_0);
 027:         """
 028:         Calculate Radiality, as defined on the original version of SRRF - REF: https://www.nature.com/articles/ncomms12471
 029:         :param magnification: Desired magnification for the generated radiality image
 030:         :param ringRadius: Radius of the ring used to calculate the radiality
 031:         :param border: Number of pixels to be zeroed on the borders of the radiality image
 032:         :param radialityPositivityConstraint: If True, the radiality image will be constrained to be positive (values >= 0)
 033:         :param doIntensityWeighting: If True, the radiality image will be weighted by the intensity of the original image
 034:         """
+035:         self.magnification = magnification
  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_magnification); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L1_error)
  __pyx_v_self->magnification = __pyx_t_1;
+036:         self.border = border
  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_border); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 36, __pyx_L1_error)
  __pyx_v_self->border = __pyx_t_1;
+037:         self.ringRadius = ringRadius * magnification
  __pyx_t_2 = PyFloat_FromDouble(__pyx_v_ringRadius); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 37, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyNumber_Multiply(__pyx_t_2, __pyx_v_magnification); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 37, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = __pyx_PyFloat_AsFloat(__pyx_t_3); if (unlikely((__pyx_t_4 == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 37, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_self->ringRadius = __pyx_t_4;
+038:         self.border = border
  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_border); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 38, __pyx_L1_error)
  __pyx_v_self->border = __pyx_t_1;
+039:         self.radialityPositivityConstraint = radialityPositivityConstraint
  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_radialityPositivityConstraint); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L1_error)
  __pyx_v_self->radialityPositivityConstraint = __pyx_t_5;
+040:         self.doIntensityWeighting = doIntensityWeighting
  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_doIntensityWeighting); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 40, __pyx_L1_error)
  __pyx_v_self->doIntensityWeighting = __pyx_t_5;
+041:         self.nRingCoordinates = 12
  __pyx_v_self->nRingCoordinates = 12;
 042: 
+043:         cdef float angleStep = (pi * 2.) / self.nRingCoordinates
  __pyx_v_angleStep = ((M_PI * 2.) / ((double)__pyx_v_self->nRingCoordinates));
+044:         with nogil:
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      _save = NULL;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L5;
        }
        __pyx_L5:;
      }
  }
+045:             for angleIter in range(self.nRingCoordinates):
        __pyx_t_1 = __pyx_v_self->nRingCoordinates;
        __pyx_t_6 = __pyx_t_1;
        for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
          __pyx_v_angleIter = __pyx_t_7;
+046:                 self.xRingCoordinates[angleIter] = cos(angleStep * angleIter) * self.ringRadius
          (__pyx_v_self->xRingCoordinates[__pyx_v_angleIter]) = (cos((__pyx_v_angleStep * __pyx_v_angleIter)) * __pyx_v_self->ringRadius);
+047:                 self.yRingCoordinates[angleIter] = sin(angleStep * angleIter) * self.ringRadius
          (__pyx_v_self->yRingCoordinates[__pyx_v_angleIter]) = (sin((__pyx_v_angleStep * __pyx_v_angleIter)) * __pyx_v_self->ringRadius);
        }
      }
 048: 
+049:     def __dealloc__(self):
/* Python wrapper */
static void __pyx_pw_7nanopyx_4core_9transform_12sr_radiality_9Radiality_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
static void __pyx_pw_7nanopyx_4core_9transform_12sr_radiality_9Radiality_3__dealloc__(PyObject *__pyx_v_self) {
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
  __pyx_pf_7nanopyx_4core_9transform_12sr_radiality_9Radiality_2__dealloc__(((struct __pyx_obj_7nanopyx_4core_9transform_12sr_radiality_Radiality *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
}

static void __pyx_pf_7nanopyx_4core_9transform_12sr_radiality_9Radiality_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_7nanopyx_4core_9transform_12sr_radiality_Radiality *__pyx_v_self) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__dealloc__", 0);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
}
 050:         # if self.xRingCoordinates is not NULL:
 051:         #     free(self.xRingCoordinates)
 052:         #     free(self.yRingCoordinates)
 053:         pass
 054: 
 055:     # @timeit2
+056:     def calculate(self, image_stack: np.ndarray):
/* Python wrapper */
static PyObject *__pyx_pw_7nanopyx_4core_9transform_12sr_radiality_9Radiality_5calculate(PyObject *__pyx_v_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_7nanopyx_4core_9transform_12sr_radiality_9Radiality_4calculate, "\n        Calculate Radiality, as defined on the original version of SRRF - REF: https://www.nature.com/articles/ncomms12471\n        :param image_stack: Image stack to be processed\n        :return: Radiality image-stack, magnified image-stack, x-gradient image, y-gradient image\n        ");
static PyMethodDef __pyx_mdef_7nanopyx_4core_9transform_12sr_radiality_9Radiality_5calculate = {"calculate", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7nanopyx_4core_9transform_12sr_radiality_9Radiality_5calculate, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7nanopyx_4core_9transform_12sr_radiality_9Radiality_4calculate};
static PyObject *__pyx_pw_7nanopyx_4core_9transform_12sr_radiality_9Radiality_5calculate(PyObject *__pyx_v_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  PyArrayObject *__pyx_v_image_stack = 0;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("calculate (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_MACROS
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args);
  if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 56, __pyx_L3_error)
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_image_stack,0};
  PyObject* values[1] = {0};
    if (__pyx_kwds) {
      Py_ssize_t kw_args;
      switch (__pyx_nargs) {
        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
      switch (__pyx_nargs) {
        case  0:
        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_image_stack)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 56, __pyx_L3_error)
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t kwd_pos_args = __pyx_nargs;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "calculate") < 0)) __PYX_ERR(0, 56, __pyx_L3_error)
      }
    } else if (unlikely(__pyx_nargs != 1)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
    }
    __pyx_v_image_stack = ((PyArrayObject *)values[0]);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("calculate", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 56, __pyx_L3_error)
  goto __pyx_L3_error;
  __pyx_L3_error:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_AddTraceback("nanopyx.core.transform.sr_radiality.Radiality.calculate", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_image_stack), __pyx_ptype_5numpy_ndarray, 0, "image_stack", 0))) __PYX_ERR(0, 56, __pyx_L1_error)
  __pyx_r = __pyx_pf_7nanopyx_4core_9transform_12sr_radiality_9Radiality_4calculate(((struct __pyx_obj_7nanopyx_4core_9transform_12sr_radiality_Radiality *)__pyx_v_self), __pyx_v_image_stack);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7nanopyx_4core_9transform_12sr_radiality_9Radiality_4calculate(struct __pyx_obj_7nanopyx_4core_9transform_12sr_radiality_Radiality *__pyx_v_self, PyArrayObject *__pyx_v_image_stack) {
  CYTHON_UNUSED int __pyx_v_nFrames;
  PyObject *__pyx_v_imRaw = NULL;
  PyObject *__pyx_v_imGx = NULL;
  PyObject *__pyx_v_imGy = NULL;
  PyObject *__pyx_v_imRad = NULL;
  PyObject *__pyx_v_imIW = NULL;
  int __pyx_v_n;
  __Pyx_memviewslice __pyx_v__imRaw = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v__imGx = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v__imGy = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v__imRad = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v__imIW = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("calculate", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_12, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_13, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_14, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_15, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_16, 1);
  __Pyx_AddTraceback("nanopyx.core.transform.sr_radiality.Radiality.calculate", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_imRaw);
  __Pyx_XDECREF(__pyx_v_imGx);
  __Pyx_XDECREF(__pyx_v_imGy);
  __Pyx_XDECREF(__pyx_v_imRad);
  __Pyx_XDECREF(__pyx_v_imIW);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v__imRaw, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v__imGx, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v__imGy, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v__imRad, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v__imIW, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__25 = PyTuple_Pack(14, __pyx_n_s_self, __pyx_n_s_image_stack, __pyx_n_s_nFrames, __pyx_n_s_imRaw, __pyx_n_s_imGx, __pyx_n_s_imGy, __pyx_n_s_imRad, __pyx_n_s_imIW, __pyx_n_s_n, __pyx_n_s_imRaw_2, __pyx_n_s_imGx_2, __pyx_n_s_imGy_2, __pyx_n_s_imRad_2, __pyx_n_s_imIW_2); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(0, 56, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__25);
  __Pyx_GIVEREF(__pyx_tuple__25);
/* … */
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 56, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_image_stack, __pyx_kp_s_np_ndarray) < 0) __PYX_ERR(0, 56, __pyx_L1_error)
  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7nanopyx_4core_9transform_12sr_radiality_9Radiality_5calculate, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Radiality_calculate, NULL, __pyx_n_s_nanopyx_core_transform_sr_radial, __pyx_d, ((PyObject *)__pyx_codeobj__26)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 56, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_7, __pyx_t_4);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7nanopyx_4core_9transform_12sr_radiality_Radiality, __pyx_n_s_calculate, __pyx_t_7) < 0) __PYX_ERR(0, 56, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  PyType_Modified(__pyx_ptype_7nanopyx_4core_9transform_12sr_radiality_Radiality);
  __pyx_codeobj__26 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 14, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__25, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_nanopyx_core_transform_sr_ra, __pyx_n_s_calculate, 56, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__26)) __PYX_ERR(0, 56, __pyx_L1_error)
 057:         """
 058:         Calculate Radiality, as defined on the original version of SRRF - REF: https://www.nature.com/articles/ncomms12471
 059:         :param image_stack: Image stack to be processed
 060:         :return: Radiality image-stack, magnified image-stack, x-gradient image, y-gradient image
 061:         """
+062:         assert image_stack.ndim == 3
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(__pyx_assertions_enabled())) {
    __pyx_t_1 = __pyx_f_5numpy_7ndarray_4ndim_ndim(__pyx_v_image_stack); if (unlikely(__pyx_t_1 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 62, __pyx_L1_error)
    __pyx_t_2 = (__pyx_t_1 == 3);
    if (unlikely(!__pyx_t_2)) {
      __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0);
      __PYX_ERR(0, 62, __pyx_L1_error)
    }
  }
  #else
  if ((1)); else __PYX_ERR(0, 62, __pyx_L1_error)
  #endif
 063: 
+064:         cdef int nFrames = image_stack.shape[0]
  __pyx_t_3 = __pyx_f_5numpy_7ndarray_5shape_shape(__pyx_v_image_stack); if (unlikely(__pyx_t_3 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 64, __pyx_L1_error)
  __pyx_v_nFrames = (__pyx_t_3[0]);
 065: 
+066:         imRaw = image_stack.astype(np.float32)
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_image_stack), __pyx_n_s_astype); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 66, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 66, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_float32); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 66, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = NULL;
  __pyx_t_1 = 0;
  #if CYTHON_UNPACK_METHODS
  if (likely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_6)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
      __pyx_t_1 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_7};
    __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_1, 1+__pyx_t_1);
    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 66, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __pyx_v_imRaw = __pyx_t_4;
  __pyx_t_4 = 0;
+067:         imGx = np.zeros_like(imRaw)
  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 67, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_zeros_like); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 67, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = NULL;
  __pyx_t_1 = 0;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_7);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_7, function);
      __pyx_t_1 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_v_imRaw};
    __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_1, 1+__pyx_t_1);
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 67, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  }
  __pyx_v_imGx = __pyx_t_4;
  __pyx_t_4 = 0;
+068:         imGy = np.zeros_like(imRaw)
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_zeros_like); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = NULL;
  __pyx_t_1 = 0;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_7)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_7);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
      __pyx_t_1 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_v_imRaw};
    __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_1, 1+__pyx_t_1);
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 68, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __pyx_v_imGy = __pyx_t_4;
  __pyx_t_4 = 0;
+069:         imRad = np.zeros((image_stack.shape[0], image_stack.shape[1]*self.magnification, image_stack.shape[2]*self.magnification), dtype=np.float32)
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_zeros); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_3 = __pyx_f_5numpy_7ndarray_5shape_shape(__pyx_v_image_stack); if (unlikely(__pyx_t_3 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 69, __pyx_L1_error)
  __pyx_t_4 = PyInt_FromSsize_t((__pyx_t_3[0])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __pyx_f_5numpy_7ndarray_5shape_shape(__pyx_v_image_stack); if (unlikely(__pyx_t_3 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 69, __pyx_L1_error)
  __pyx_t_7 = PyInt_FromSsize_t(((__pyx_t_3[1]) * __pyx_v_self->magnification)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __pyx_f_5numpy_7ndarray_5shape_shape(__pyx_v_image_stack); if (unlikely(__pyx_t_3 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 69, __pyx_L1_error)
  __pyx_t_6 = PyInt_FromSsize_t(((__pyx_t_3[2]) * __pyx_v_self->magnification)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_GIVEREF(__pyx_t_4);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4)) __PYX_ERR(0, 69, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_7);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_7)) __PYX_ERR(0, 69, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_6);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_6)) __PYX_ERR(0, 69, __pyx_L1_error);
  __pyx_t_4 = 0;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_GIVEREF(__pyx_t_8);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_8)) __PYX_ERR(0, 69, __pyx_L1_error);
  __pyx_t_8 = 0;
  __pyx_t_8 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_float32); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_6, __pyx_t_8); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  __pyx_v_imRad = __pyx_t_4;
  __pyx_t_4 = 0;
+070:         imIW = np.zeros((image_stack.shape[0], image_stack.shape[1]*self.magnification, image_stack.shape[2]*self.magnification), dtype=np.float32)
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_zeros); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_3 = __pyx_f_5numpy_7ndarray_5shape_shape(__pyx_v_image_stack); if (unlikely(__pyx_t_3 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 70, __pyx_L1_error)
  __pyx_t_4 = PyInt_FromSsize_t((__pyx_t_3[0])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __pyx_f_5numpy_7ndarray_5shape_shape(__pyx_v_image_stack); if (unlikely(__pyx_t_3 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 70, __pyx_L1_error)
  __pyx_t_6 = PyInt_FromSsize_t(((__pyx_t_3[1]) * __pyx_v_self->magnification)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_3 = __pyx_f_5numpy_7ndarray_5shape_shape(__pyx_v_image_stack); if (unlikely(__pyx_t_3 == ((npy_intp *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 70, __pyx_L1_error)
  __pyx_t_5 = PyInt_FromSsize_t(((__pyx_t_3[2]) * __pyx_v_self->magnification)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GIVEREF(__pyx_t_4);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_4)) __PYX_ERR(0, 70, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_6);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_6)) __PYX_ERR(0, 70, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_5);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_5)) __PYX_ERR(0, 70, __pyx_L1_error);
  __pyx_t_4 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_7);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_7)) __PYX_ERR(0, 70, __pyx_L1_error);
  __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_float32); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_5, __pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_v_imIW = __pyx_t_4;
  __pyx_t_4 = 0;
 071: 
 072:         cdef int n
+073:         cdef float[:,:,:] _imRaw = imRaw
  __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_float(__pyx_v_imRaw, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 73, __pyx_L1_error)
  __pyx_v__imRaw = __pyx_t_9;
  __pyx_t_9.memview = NULL;
  __pyx_t_9.data = NULL;
+074:         cdef float[:,:,:] _imGx = imGx
  __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_float(__pyx_v_imGx, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 74, __pyx_L1_error)
  __pyx_v__imGx = __pyx_t_9;
  __pyx_t_9.memview = NULL;
  __pyx_t_9.data = NULL;
+075:         cdef float[:,:,:] _imGy = imGy
  __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_float(__pyx_v_imGy, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 75, __pyx_L1_error)
  __pyx_v__imGy = __pyx_t_9;
  __pyx_t_9.memview = NULL;
  __pyx_t_9.data = NULL;
+076:         cdef float[:,:,:] _imRad = imRad
  __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_float(__pyx_v_imRad, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 76, __pyx_L1_error)
  __pyx_v__imRad = __pyx_t_9;
  __pyx_t_9.memview = NULL;
  __pyx_t_9.data = NULL;
+077:         cdef float[:,:,:] _imIW = imIW
  __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_float(__pyx_v_imIW, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 77, __pyx_L1_error)
  __pyx_v__imIW = __pyx_t_9;
  __pyx_t_9.memview = NULL;
  __pyx_t_9.data = NULL;
 078: 
+079:         with nogil:
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      _save = NULL;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L5;
        }
        __pyx_L4_error: {
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L1_error;
        }
        __pyx_L5:;
      }
  }
+080:             for n in prange(nFrames): #, schedule='static', chunksize=1):
        __pyx_t_1 = __pyx_v_nFrames;
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_11 = (__pyx_t_1 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_11 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_n) lastprivate(__pyx_v_n)
                    #endif /* _OPENMP */
                    for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_11; __pyx_t_10++){
                        {
                            __pyx_v_n = (int)(0 + 1 * __pyx_t_10);
+081:                 self._calculate_radiality(_imRaw[n,:,:], _imRad[n,:,:], _imIW[n,:,:], _imGx[n,:,:], _imGy[n,:,:], 0, 0)
                            __pyx_t_12.data = __pyx_v__imRaw.data;
                            __pyx_t_12.memview = __pyx_v__imRaw.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_12, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_n;
    Py_ssize_t __pyx_tmp_stride = __pyx_v__imRaw.strides[0];
        __pyx_t_12.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_12.shape[0] = __pyx_v__imRaw.shape[1];
__pyx_t_12.strides[0] = __pyx_v__imRaw.strides[1];
    __pyx_t_12.suboffsets[0] = -1;

__pyx_t_12.shape[1] = __pyx_v__imRaw.shape[2];
__pyx_t_12.strides[1] = __pyx_v__imRaw.strides[2];
    __pyx_t_12.suboffsets[1] = -1;

__pyx_t_13.data = __pyx_v__imRad.data;
                            __pyx_t_13.memview = __pyx_v__imRad.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_13, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_n;
    Py_ssize_t __pyx_tmp_stride = __pyx_v__imRad.strides[0];
        __pyx_t_13.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_13.shape[0] = __pyx_v__imRad.shape[1];
__pyx_t_13.strides[0] = __pyx_v__imRad.strides[1];
    __pyx_t_13.suboffsets[0] = -1;

__pyx_t_13.shape[1] = __pyx_v__imRad.shape[2];
__pyx_t_13.strides[1] = __pyx_v__imRad.strides[2];
    __pyx_t_13.suboffsets[1] = -1;

__pyx_t_14.data = __pyx_v__imIW.data;
                            __pyx_t_14.memview = __pyx_v__imIW.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_14, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_n;
    Py_ssize_t __pyx_tmp_stride = __pyx_v__imIW.strides[0];
        __pyx_t_14.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_14.shape[0] = __pyx_v__imIW.shape[1];
__pyx_t_14.strides[0] = __pyx_v__imIW.strides[1];
    __pyx_t_14.suboffsets[0] = -1;

__pyx_t_14.shape[1] = __pyx_v__imIW.shape[2];
__pyx_t_14.strides[1] = __pyx_v__imIW.strides[2];
    __pyx_t_14.suboffsets[1] = -1;

__pyx_t_15.data = __pyx_v__imGx.data;
                            __pyx_t_15.memview = __pyx_v__imGx.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_n;
    Py_ssize_t __pyx_tmp_stride = __pyx_v__imGx.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v__imGx.shape[1];
__pyx_t_15.strides[0] = __pyx_v__imGx.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v__imGx.shape[2];
__pyx_t_15.strides[1] = __pyx_v__imGx.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_16.data = __pyx_v__imGy.data;
                            __pyx_t_16.memview = __pyx_v__imGy.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_n;
    Py_ssize_t __pyx_tmp_stride = __pyx_v__imGy.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v__imGy.shape[1];
__pyx_t_16.strides[0] = __pyx_v__imGy.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v__imGy.shape[2];
__pyx_t_16.strides[1] = __pyx_v__imGy.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

((struct __pyx_vtabstruct_7nanopyx_4core_9transform_12sr_radiality_Radiality *)__pyx_v_self->__pyx_vtab)->_calculate_radiality(__pyx_v_self, __pyx_t_12, __pyx_t_13, __pyx_t_14, __pyx_t_15, __pyx_t_16, 0.0, 0.0); if (unlikely(__Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 81, __pyx_L8_error)
                            __PYX_XCLEAR_MEMVIEW(&__pyx_t_12, 0);
                            __pyx_t_12.memview = NULL; __pyx_t_12.data = NULL;
                            __PYX_XCLEAR_MEMVIEW(&__pyx_t_13, 0);
                            __pyx_t_13.memview = NULL; __pyx_t_13.data = NULL;
                            __PYX_XCLEAR_MEMVIEW(&__pyx_t_14, 0);
                            __pyx_t_14.memview = NULL; __pyx_t_14.data = NULL;
                            __PYX_XCLEAR_MEMVIEW(&__pyx_t_15, 0);
                            __pyx_t_15.memview = NULL; __pyx_t_15.data = NULL;
                            __PYX_XCLEAR_MEMVIEW(&__pyx_t_16, 0);
                            __pyx_t_16.memview = NULL; __pyx_t_16.data = NULL;
                            goto __pyx_L11;
                            __pyx_L8_error:;
                            {
                                #ifdef WITH_THREAD
                                PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
                                #endif
                                #ifdef _OPENMP
                                #pragma omp flush(__pyx_parallel_exc_type)
                                #endif /* _OPENMP */
                                if (!__pyx_parallel_exc_type) {
                                  __Pyx_ErrFetchWithState(&__pyx_parallel_exc_type, &__pyx_parallel_exc_value, &__pyx_parallel_exc_tb);
                                  __pyx_parallel_filename = __pyx_filename; __pyx_parallel_lineno = __pyx_lineno; __pyx_parallel_clineno = __pyx_clineno;
                                  __Pyx_GOTREF(__pyx_parallel_exc_type);
                                }
                                #ifdef WITH_THREAD
                                __Pyx_PyGILState_Release(__pyx_gilstate_save);
                                #endif
                            }
                            __pyx_parallel_why = 4;
                            goto __pyx_L10;
                            __pyx_L10:;
                            #ifdef _OPENMP
                            #pragma omp critical(__pyx_parallel_lastprivates15)
                            #endif /* _OPENMP */
                            {
                                __pyx_parallel_temp0 = __pyx_v_n;
                            }
                            __pyx_L11:;
                            #ifdef _OPENMP
                            #pragma omp flush(__pyx_parallel_why)
                            #endif /* _OPENMP */
                        }
                    }
                    #ifdef _OPENMP
                    Py_END_ALLOW_THREADS
                    #else
{
#ifdef WITH_THREAD
                    PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
                    #endif
                    #endif /* _OPENMP */
                    /* Clean up any temporaries */
                    __PYX_XCLEAR_MEMVIEW(&__pyx_t_12, 0);
                    __pyx_t_12.memview = NULL; __pyx_t_12.data = NULL;
                    __PYX_XCLEAR_MEMVIEW(&__pyx_t_13, 0);
                    __pyx_t_13.memview = NULL; __pyx_t_13.data = NULL;
                    __PYX_XCLEAR_MEMVIEW(&__pyx_t_14, 0);
                    __pyx_t_14.memview = NULL; __pyx_t_14.data = NULL;
                    __PYX_XCLEAR_MEMVIEW(&__pyx_t_15, 0);
                    __pyx_t_15.memview = NULL; __pyx_t_15.data = NULL;
                    __PYX_XCLEAR_MEMVIEW(&__pyx_t_16, 0);
                    __pyx_t_16.memview = NULL; __pyx_t_16.data = NULL;
                    #ifdef WITH_THREAD
                    __Pyx_PyGILState_Release(__pyx_gilstate_save);
                    #endif
                    #ifndef _OPENMP
}
#endif /* _OPENMP */
                }
            }
            if (__pyx_parallel_exc_type) {
              /* This may have been overridden by a continue, break or return in another thread. Prefer the error. */
              __pyx_parallel_why = 4;
            }
            if (__pyx_parallel_why) {
              __pyx_v_n = __pyx_parallel_temp0;
              switch (__pyx_parallel_why) {
                    case 4:
                {
                    #ifdef WITH_THREAD
                    PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
                    #endif
                    __Pyx_GIVEREF(__pyx_parallel_exc_type);
                    __Pyx_ErrRestoreWithState(__pyx_parallel_exc_type, __pyx_parallel_exc_value, __pyx_parallel_exc_tb);
                    __pyx_filename = __pyx_parallel_filename; __pyx_lineno = __pyx_parallel_lineno; __pyx_clineno = __pyx_parallel_clineno;
                    #ifdef WITH_THREAD
                    __Pyx_PyGILState_Release(__pyx_gilstate_save);
                    #endif
                }
                goto __pyx_L4_error;
              }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
 082: 
+083:         return imRad, imIW, imGx, imGy
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 83, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_v_imRad);
  __Pyx_GIVEREF(__pyx_v_imRad);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_imRad)) __PYX_ERR(0, 83, __pyx_L1_error);
  __Pyx_INCREF(__pyx_v_imIW);
  __Pyx_GIVEREF(__pyx_v_imIW);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_imIW)) __PYX_ERR(0, 83, __pyx_L1_error);
  __Pyx_INCREF(__pyx_v_imGx);
  __Pyx_GIVEREF(__pyx_v_imGx);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_imGx)) __PYX_ERR(0, 83, __pyx_L1_error);
  __Pyx_INCREF(__pyx_v_imGy);
  __Pyx_GIVEREF(__pyx_v_imGy);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_v_imGy)) __PYX_ERR(0, 83, __pyx_L1_error);
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 084: 
+085:     cdef void _calculate_radiality(self, float[:,:] imRaw, float[:,:] imRad, float[:,:] imIW, float[:,:] imGx, float[:,:] imGy, float shiftX, float shiftY) nogil:
static void __pyx_f_7nanopyx_4core_9transform_12sr_radiality_9Radiality__calculate_radiality(struct __pyx_obj_7nanopyx_4core_9transform_12sr_radiality_Radiality *__pyx_v_self, __Pyx_memviewslice __pyx_v_imRaw, __Pyx_memviewslice __pyx_v_imRad, __Pyx_memviewslice __pyx_v_imIW, __Pyx_memviewslice __pyx_v_imGx, __Pyx_memviewslice __pyx_v_imGy, float __pyx_v_shiftX, float __pyx_v_shiftY) {
  int __pyx_v_w;
  int __pyx_v_h;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_sampleIter;
  float __pyx_v_x0;
  float __pyx_v_y0;
  float __pyx_v_xc;
  float __pyx_v_yc;
  float __pyx_v_GMag;
  float __pyx_v_xRing;
  float __pyx_v_yRing;
  float __pyx_v_vGx;
  float __pyx_v_vGy;
  float __pyx_v_CGH;
  float __pyx_v_Dk;
  float __pyx_v_DivDFactor;
  #ifdef WITH_THREAD
  PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  #endif
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_calculate_radiality", 0);
  #ifdef WITH_THREAD
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  #endif
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  #ifdef WITH_THREAD
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  #endif
  __Pyx_AddTraceback("nanopyx.core.transform.sr_radiality.Radiality._calculate_radiality", __pyx_clineno, __pyx_lineno, __pyx_filename);
  #ifdef WITH_THREAD
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  #endif
  __pyx_L0:;
  __Pyx_RefNannyFinishContextNogil()
}
 086:         """
 087:         Note that Gx and Gy are initialized but zeroed
 088:         """
 089: 
+090:         cdef int w = imRaw.shape[1]
  __pyx_v_w = (__pyx_v_imRaw.shape[1]);
+091:         cdef int h = imRaw.shape[0]
  __pyx_v_h = (__pyx_v_imRaw.shape[0]);
 092:         cdef int i, j, sampleIter
 093:         cdef float x0, y0, xc, yc, GMag, xRing, yRing
 094: 
 095:         # calculate Gx and Gy
 096:         cdef float vGx, vGy
 097:         cdef float CGH # for Culley Gustafsson Henriques transform
 098: 
 099:         # Radiality Variable
+100:         cdef float Dk, DivDFactor = 0
  __pyx_v_DivDFactor = 0.0;
 101: 
 102:         # for j in range(1, h-1):
 103:         #     for i in range(1, w-1):
 104:         #         imGx[j,i] = -imRaw[j,i-1]+imRaw[j,i+1]
 105:         #         imGy[j,i] = -imRaw[j-1,i]+imRaw[j+1,i]
+106:         _c_gradient_radiality(&imRaw[0,0], &imGx[0,0], &imGy[0,0], imRaw.shape[0], imRaw.shape[1])
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_3 = 0;
  __pyx_t_4 = 0;
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  _c_gradient_radiality((&(*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imRaw.data + __pyx_t_1 * __pyx_v_imRaw.strides[0]) ) + __pyx_t_2 * __pyx_v_imRaw.strides[1]) )))), (&(*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imGx.data + __pyx_t_3 * __pyx_v_imGx.strides[0]) ) + __pyx_t_4 * __pyx_v_imGx.strides[1]) )))), (&(*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imGy.data + __pyx_t_5 * __pyx_v_imGy.strides[0]) ) + __pyx_t_6 * __pyx_v_imGy.strides[1]) )))), (__pyx_v_imRaw.shape[0]), (__pyx_v_imRaw.shape[1]));
 107: 
+108:         for j in range((1 + self.border) * self.magnification, (h - 1 - self.border) * self.magnification):
  __pyx_t_7 = (((__pyx_v_h - 1) - __pyx_v_self->border) * __pyx_v_self->magnification);
  __pyx_t_8 = __pyx_t_7;
  for (__pyx_t_9 = ((1 + __pyx_v_self->border) * __pyx_v_self->magnification); __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
    __pyx_v_j = __pyx_t_9;
+109:             for i in range((1 + self.border) * self.magnification, (w - 1 - self.border) * self.magnification):
    __pyx_t_10 = (((__pyx_v_w - 1) - __pyx_v_self->border) * __pyx_v_self->magnification);
    __pyx_t_11 = __pyx_t_10;
    for (__pyx_t_12 = ((1 + __pyx_v_self->border) * __pyx_v_self->magnification); __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
      __pyx_v_i = __pyx_t_12;
+110:                 xc = i + 0.5 + shiftX * self.magnification
      __pyx_v_xc = ((__pyx_v_i + 0.5) + (__pyx_v_shiftX * __pyx_v_self->magnification));
+111:                 yc = j + 0.5 + shiftY * self.magnification
      __pyx_v_yc = ((__pyx_v_j + 0.5) + (__pyx_v_shiftY * __pyx_v_self->magnification));
 112: 
+113:                 imIW[j,i] = _interpolate(imRaw, xc / self.magnification, yc / self.magnification)
      __pyx_t_13 = __pyx_f_7nanopyx_4core_9transform_25interpolation_catmull_rom__interpolate(__pyx_v_imRaw, (__pyx_v_xc / ((float)__pyx_v_self->magnification)), (__pyx_v_yc / ((float)__pyx_v_self->magnification))); if (unlikely(__Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 113, __pyx_L1_error)
      __pyx_t_6 = __pyx_v_j;
      __pyx_t_5 = __pyx_v_i;
      *((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imIW.data + __pyx_t_6 * __pyx_v_imIW.strides[0]) ) + __pyx_t_5 * __pyx_v_imIW.strides[1]) )) = __pyx_t_13;
 114: 
 115:                 # Output
+116:                 CGH = 0
      __pyx_v_CGH = 0.0;
+117:                 for sampleIter in range(0, self.nRingCoordinates):
      __pyx_t_14 = __pyx_v_self->nRingCoordinates;
      __pyx_t_15 = __pyx_t_14;
      for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) {
        __pyx_v_sampleIter = __pyx_t_16;
+118:                     xRing = self.xRingCoordinates[sampleIter]
        __pyx_v_xRing = (__pyx_v_self->xRingCoordinates[__pyx_v_sampleIter]);
+119:                     yRing = self.yRingCoordinates[sampleIter]
        __pyx_v_yRing = (__pyx_v_self->yRingCoordinates[__pyx_v_sampleIter]);
 120: 
+121:                     x0 = xc + xRing
        __pyx_v_x0 = (__pyx_v_xc + __pyx_v_xRing);
+122:                     y0 = yc + yRing
        __pyx_v_y0 = (__pyx_v_yc + __pyx_v_yRing);
 123: 
+124:                     vGx = _interpolate(imGx, x0 / self.magnification, y0 / self.magnification)
        __pyx_t_13 = __pyx_f_7nanopyx_4core_9transform_25interpolation_catmull_rom__interpolate(__pyx_v_imGx, (__pyx_v_x0 / ((float)__pyx_v_self->magnification)), (__pyx_v_y0 / ((float)__pyx_v_self->magnification))); if (unlikely(__Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 124, __pyx_L1_error)
        __pyx_v_vGx = __pyx_t_13;
+125:                     vGy = _interpolate(imGy, x0 / self.magnification, y0 / self.magnification)
        __pyx_t_13 = __pyx_f_7nanopyx_4core_9transform_25interpolation_catmull_rom__interpolate(__pyx_v_imGy, (__pyx_v_x0 / ((float)__pyx_v_self->magnification)), (__pyx_v_y0 / ((float)__pyx_v_self->magnification))); if (unlikely(__Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 125, __pyx_L1_error)
        __pyx_v_vGy = __pyx_t_13;
+126:                     GMag = sqrt(vGx * vGx + vGy * vGy)
        __pyx_v_GMag = sqrt(((__pyx_v_vGx * __pyx_v_vGx) + (__pyx_v_vGy * __pyx_v_vGy)));
 127: 
+128:                     Dk = 1 - self._calculateDk(x0, y0, xc, yc, vGx, vGy, GMag) / self.ringRadius
        __pyx_t_13 = ((struct __pyx_vtabstruct_7nanopyx_4core_9transform_12sr_radiality_Radiality *)__pyx_v_self->__pyx_vtab)->_calculateDk(__pyx_v_self, __pyx_v_x0, __pyx_v_y0, __pyx_v_xc, __pyx_v_yc, __pyx_v_vGx, __pyx_v_vGy, __pyx_v_GMag); if (unlikely(__Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 128, __pyx_L1_error)
        __pyx_v_Dk = (1.0 - (__pyx_t_13 / __pyx_v_self->ringRadius));
+129:                     Dk = Dk * Dk
        __pyx_v_Dk = (__pyx_v_Dk * __pyx_v_Dk);
 130: 
+131:                     if (vGx * xRing + vGy * yRing) > 0: # inwards or outwards vector
        __pyx_t_17 = (((__pyx_v_vGx * __pyx_v_xRing) + (__pyx_v_vGy * __pyx_v_yRing)) > 0.0);
        if (__pyx_t_17) {
/* … */
          goto __pyx_L9;
        }
+132:                         DivDFactor -= Dk
          __pyx_v_DivDFactor = (__pyx_v_DivDFactor - __pyx_v_Dk);
 133:                     else:
+134:                         DivDFactor += Dk
        /*else*/ {
          __pyx_v_DivDFactor = (__pyx_v_DivDFactor + __pyx_v_Dk);
        }
        __pyx_L9:;
      }
 135: 
+136:                 DivDFactor /= self.nRingCoordinates
      __pyx_v_DivDFactor = (__pyx_v_DivDFactor / __pyx_v_self->nRingCoordinates);
 137: 
+138:                 if self.radialityPositivityConstraint:
      if (__pyx_v_self->radialityPositivityConstraint) {
/* … */
        goto __pyx_L10;
      }
+139:                     CGH = max(DivDFactor, 0)
        __pyx_t_18 = 0;
        __pyx_t_13 = __pyx_v_DivDFactor;
        __pyx_t_17 = (__pyx_t_18 > __pyx_t_13);
        if (__pyx_t_17) {
          __pyx_t_19 = __pyx_t_18;
        } else {
          __pyx_t_19 = __pyx_t_13;
        }
        __pyx_v_CGH = __pyx_t_19;
 140:                 else:
+141:                     CGH = DivDFactor
      /*else*/ {
        __pyx_v_CGH = __pyx_v_DivDFactor;
      }
      __pyx_L10:;
 142: 
+143:                 if self.doIntensityWeighting:
      if (__pyx_v_self->doIntensityWeighting) {
/* … */
        goto __pyx_L11;
      }
+144:                     imRad[j,i] = CGH * imIW[j,i]
        __pyx_t_5 = __pyx_v_j;
        __pyx_t_6 = __pyx_v_i;
        __pyx_t_4 = __pyx_v_j;
        __pyx_t_3 = __pyx_v_i;
        *((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imRad.data + __pyx_t_4 * __pyx_v_imRad.strides[0]) ) + __pyx_t_3 * __pyx_v_imRad.strides[1]) )) = (__pyx_v_CGH * (*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imIW.data + __pyx_t_5 * __pyx_v_imIW.strides[0]) ) + __pyx_t_6 * __pyx_v_imIW.strides[1]) ))));
 145: 
 146:                 else:
+147:                     imRad[j,i] = CGH
      /*else*/ {
        __pyx_t_6 = __pyx_v_j;
        __pyx_t_5 = __pyx_v_i;
        *((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_imRad.data + __pyx_t_6 * __pyx_v_imRad.strides[0]) ) + __pyx_t_5 * __pyx_v_imRad.strides[1]) )) = __pyx_v_CGH;
      }
      __pyx_L11:;
    }
  }
 148: 
 149: 
+150:     cdef float _calculateDk(self, float x, float y, float xc, float yc, float vGx, float vGy, float vGx2Gy2) nogil:
static float __pyx_f_7nanopyx_4core_9transform_12sr_radiality_9Radiality__calculateDk(struct __pyx_obj_7nanopyx_4core_9transform_12sr_radiality_Radiality *__pyx_v_self, float __pyx_v_x, float __pyx_v_y, float __pyx_v_xc, float __pyx_v_yc, float __pyx_v_vGx, float __pyx_v_vGy, float __pyx_v_vGx2Gy2) {
  float __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
+151:         if vGx2Gy2 == 0:
  __pyx_t_1 = (__pyx_v_vGx2Gy2 == 0.0);
  if (__pyx_t_1) {
/* … */
  }
+152:             return self.ringRadius
    __pyx_r = __pyx_v_self->ringRadius;
    goto __pyx_L0;
 153:         else:
+154:             return fabs(vGy * (xc - x) - vGx * (yc - y)) / vGx2Gy2
  /*else*/ {
    __pyx_r = (fabs(((__pyx_v_vGy * (__pyx_v_xc - __pyx_v_x)) - (__pyx_v_vGx * (__pyx_v_yc - __pyx_v_y)))) / ((double)__pyx_v_vGx2Gy2));
    goto __pyx_L0;
  }